package com.example.cs342messenger;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import basicClasses.LoginObject;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Activity which displays a login screen to the user, offering registration as
 * well.
 */

public class LoginActivity extends Activity
{
	public static boolean		registerAcc	= false;
	public static boolean		loggedIn = false;
	SharedPreferences			mPrefs;

	/**
	 * The default email to populate the email field with.
	 */
	public static final String	EXTRA_EMAIL	= "com.example.android.authenticatordemo.extra.EMAIL";

	/**
	 * Keep track of the login task to ensure we can cancel it if requested.
	 */
	private UserLoginTask		mAuthTask	= null;

	// Values for email and password at the time of the login attempt.
	private String				mEmail;
	private String				mPassword;

	// UI references.
	private EditText			mEmailView;
	private EditText			mPasswordView;
	private View				mLoginFormView;
	private View				mLoginStatusView;
	private TextView			mLoginStatusMessageView;
	private LoginObject			login;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);

		Context mContext = this.getApplicationContext();
		mPrefs = mContext.getSharedPreferences("myPrefs", MODE_PRIVATE);

		String user = mPrefs.getString("user", "No User");
		
		loggedIn = false;

		/*SharedPreferences.Editor edit = mPrefs.edit();
		edit.putString("updates", "Bill Guy");
		edit.commit();*/
		
		setContentView(R.layout.activity_login);
		// showProgress(false);

		// Set up the login form.
		mEmail = getIntent().getStringExtra(EXTRA_EMAIL);
		mEmailView = (EditText) findViewById(R.id.email);
		mEmailView.setText(mEmail);

		mPasswordView = (EditText) findViewById(R.id.password);
		mPasswordView
				.setOnEditorActionListener(new TextView.OnEditorActionListener()
				{
					@Override
					public boolean onEditorAction(TextView textView, int id,
							KeyEvent keyEvent)
					{
						if (id == R.id.login || id == EditorInfo.IME_NULL)
						{
							attemptLogin();
							return true;
						}
						return false;
					}
				});

		mLoginFormView = findViewById(R.id.login_form);
		mLoginStatusView = findViewById(R.id.login_status);
		mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);

		findViewById(R.id.sign_in_button).setOnClickListener(
				new View.OnClickListener()
				{
					@Override
					public void onClick(View view)
					{
						attemptLogin();
					}
				});
		if (!user.equals("No User"))
		{
			// Toast.makeText(this, "Welcome " + user, Toast.LENGTH_SHORT);
			EditText e = (EditText) findViewById(R.id.email);
			e.setText(user);
		}
		

		findViewById(R.id.reg).setOnClickListener(
				new View.OnClickListener()
				{
					@Override
					public void onClick(View view)
					{
						Intent intent = new Intent(LoginActivity.this,Register.class);
						LoginActivity.this.startActivity(intent);
					}
				});
	}
	
	

	public void onResume()
	{
		super.onResume();
		if(loggedIn){
			finish();
		}
		if (registerAcc)
		{
			registerAcc = false;
			loggedIn = true;
			Intent intent = new Intent(this, ConversationList.class);
			startActivity(intent);
		}
		EditText p = (EditText)findViewById(R.id.password);
		p.setText("");
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		super.onCreateOptionsMenu(menu);
		getMenuInflater().inflate(R.menu.activity_login, menu);
		return true;
	}

	public void regScreen(View view)
	{
		Intent intent = new Intent(this, Register.class);
		startActivity(intent);
	}

	/**
	 * Attempts to sign in or register the account specified by the login form.
	 * If there are form errors (invalid email, missing fields, etc.), the
	 * errors are presented and no actual login attempt is made.
	 */
	public void attemptLogin()
	{
		if (mAuthTask != null)
		{
			return;
		}

		// Reset errors.
		mEmailView.setError(null);
		mPasswordView.setError(null);

		// Store values at the time of the login attempt.
		mEmail = mEmailView.getText().toString();
		mPassword = mPasswordView.getText().toString();

		boolean cancel = false;
		View focusView = null;

		// Check for a valid password.
		if (TextUtils.isEmpty(mPassword))
		{
			mPasswordView.setError(getString(R.string.error_field_required));
			focusView = mPasswordView;
			cancel = true;
		}
		else if (mPassword.length() < 4)
		{
			mPasswordView.setError(getString(R.string.error_invalid_password));
			focusView = mPasswordView;
			cancel = true;
		}

		// Check for a valid email address.
		if (TextUtils.isEmpty(mEmail))
		{
			mEmailView.setError(getString(R.string.error_field_required));
			focusView = mEmailView;
			cancel = true;
		}
		else if (!mEmail.contains("@"))
		{
			mEmailView.setError(getString(R.string.error_invalid_email));
			focusView = mEmailView;
			cancel = true;
		}

		if (cancel)
		{
			// There was an error; don't attempt login and focus the first
			// form field with an error.
			focusView.requestFocus();
		}
		else
		{
			// Show a progress spinner, and kick off a background task to
			// perform the user login attempt.
			mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
			showProgress(true);

			login = new LoginObject(mEmail, mPassword);
			mAuthTask = new UserLoginTask();
			mAuthTask.execute(login);
		}
	}

	/**
	 * Shows the progress UI and hides the login form.
	 */
	@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
	private void showProgress(final boolean show)
	{
		// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
		// for very easy animations. If available, use these APIs to fade-in
		// the progress spinner.
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2)
		{
			int shortAnimTime = getResources().getInteger(
					android.R.integer.config_shortAnimTime);

			mLoginStatusView.setVisibility(View.VISIBLE);
			mLoginStatusView.animate().setDuration(shortAnimTime)
					.alpha(show ? 1 : 0)
					.setListener(new AnimatorListenerAdapter()
					{
						@Override
						public void onAnimationEnd(Animator animation)
						{
							mLoginStatusView.setVisibility(show ? View.VISIBLE
									: View.GONE);
						}
					});

			mLoginFormView.setVisibility(View.VISIBLE);
			mLoginFormView.animate().setDuration(shortAnimTime)
					.alpha(show ? 0 : 1)
					.setListener(new AnimatorListenerAdapter()
					{
						@Override
						public void onAnimationEnd(Animator animation)
						{
							mLoginFormView.setVisibility(show ? View.GONE
									: View.VISIBLE);
						}
					});
		}
		else
		{
			// The ViewPropertyAnimator APIs are not available, so simply show
			// and hide the relevant UI components.
			mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
			mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
		}
	}

	/**
	 * Represents an asynchronous login/registration task used to authenticate
	 * the user. Mine
	 */
	public class UserLoginTask extends AsyncTask<LoginObject, Void, Boolean>
	{
		@Override
		protected Boolean doInBackground(LoginObject... params)
		{
			// TODO: attempt authentication against a network service.
			HttpClient httpclient = new DefaultHttpClient();
			HttpPost httppost = new HttpPost(
					"http://softeng.cs.uwosh.edu/students/cs342g6/login.php");
			Boolean response = false;
			try
			{
				// Convert the login object to XML
				XStream xstream = new XStream(new DomDriver("UTF-8"));
				xstream.alias("Login", LoginObject.class);
				String xml = xstream.toXML(login);

				// Pass the XML as a StringEntity
				StringEntity se = new StringEntity(xml, HTTP.UTF_8);
				se.setContentType("text/xml");
				httppost.setEntity(se);
				System.out.println("MADE IT TO RESPONSE");
				HttpResponse httpresponse = httpclient.execute(httppost);
				HttpEntity resEntity = httpresponse.getEntity();
				String resp = EntityUtils.toString(resEntity);
				System.out.println(resp);
				response = convertToBool(resp);
				if (response)
					System.out.println("true");
				else
					System.out.println("false");
			}
			catch (ClientProtocolException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			catch (IOException e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return response;
		}

		@Override
		protected void onPostExecute(Boolean success)
		{
			System.out.println("holy shit i made it");
			mAuthTask = null;
			showProgress(false);

			if (success)
			{
				//throw in database here
				mPrefs = getSharedPreferences("myPrefs", MODE_PRIVATE);
				SharedPreferences.Editor edit = mPrefs.edit();
				edit.putString("user", mEmail);
				edit.commit();
				Intent intent = new Intent(LoginActivity.this,ConversationList.class);
				LoginActivity.this.startActivity(intent);
				loggedIn = true;
				//finish();
			}
			else
			{
				mPasswordView
						.setError(getString(R.string.error_incorrect_password));
				mPasswordView.requestFocus();
			}
		}

		protected void onCancelled()
		{
			mAuthTask = null;
			showProgress(false);
		}

		/*
		 * Convert the string return from the web service to a boolean
		 */
		protected boolean convertToBool(String str)
		{
			if (str.equalsIgnoreCase("TRUE"))
				return true;
			else
				return false;
		}
	}
}
